import { http } from "@/utils/http";
import { type BaseResponseType, baseUrlApi } from "@/api/types";

/**
 * @description: 获取商品搜索数据
 * @param {*} data 查询参数
 * @return {*}
 */
export const searchProduct = function (data) {
  // 合并默认查询参数
  let defaultConfig = {
    page: 1,
    size: 12,
  };

  let allowedProperties = [
    "page",
    "size",
    "text",
    "brandids",
    "categoryids",
    "code",
    "casno",
    "lowerprice",
    "upperprice",
    "sort",
  ];

  let selectProperties = ["text", "brandids", "categoryids", "code", "casno"];

  let searchConfig = Object.assign(
    defaultConfig,
    checkSearchParams(allowedProperties, selectProperties, data)
  );

  return http.post(baseUrlApi("/product/search"), { data: searchConfig });
};

/**
 * @description: 获取关键词分类集
 * @param {*} data
 * @return {*}
 */
export const searchTip = function (data) {
  let defaultConfig = {
    brandids: [],
    categoryids: [],
    text: "",
  };
  let properties = ["brandids", "categoryids", "text"];

  // return http.post({
  //     url: '/product/searchtip',
  //     method: 'get',
  //     params: Object.assign(defaultConfig, checkSearchParams(properties, properties, data)),
  // });
  return http.get(baseUrlApi("/product/searchtip"), { params: data });
};

// 通用方法
/**
 * @description: 删除无效属性
 * @param {*} obj  查询参数对象
 * @param {*} allowedProperties 允许的属性列表
 * @return {*}
 */
function removeProperties(obj, allowedProperties) {
  // 遍历对象的属性
  for (const property in obj) {
    // 如果该属性不在允许列表中，删除它
    if (!allowedProperties.includes(property)) {
      delete obj[property];
    }
  }
  return obj;
}

/**
 * 检查对象是否包含指定的属性之一。
 *
 * @param {Object} obj - 被检查的对象。
 * @param {Array} properties - 属性名称的数组，用于检查对象是否包含这些属性之一。
 * @returns {boolean} - 如果对象包含至少一个指定的属性，则返回true；否则返回false。
 */
function hasAnyProperty(obj, properties) {
  // 遍历属性数组，检查每个属性是否存在于对象中
  for (const property of properties) {
    // 使用in运算符检查对象是否包含当前属性
    if (property in obj) {
      // 如果对象包含当前属性，则立即返回true
      return true;
    }
  }
  // 如果遍历完所有属性后都没有找到匹配的属性，则返回false
  return false;
}

/**
 * 检查查询参数是否符合允许的列表。
 * 该函数主要用于从数据对象中移除非允许列表中的属性，如果数据对象中包含选择列表中的任何属性，则返回处理后的对象。
 * 如果数据对象中不包含选择列表中的任何属性，则显示错误消息。
 *
 * @param {Array} allowList - 允许的参数列表。这是用于确定哪些属性应该保留在数据对象中的列表。
 * @param {Array} selectList - 选择的参数列表。这是用于检查数据对象是否包含任何指定属性的列表。
 * @param {Object} data - 待检查的查询参数对象。
 * @returns {Object|void} 如果数据对象包含选择列表中的任何属性，则返回移除非允许属性后的对象；否则不返回任何值。
 */
let checkSearchParams = (allowList, selectList, data) => {
  let paramsObj = removeProperties(data, allowList);
  if (hasAnyProperty(data, selectList)) {
    return paramsObj;
  }
  console.log("查询参数错误");
};
